home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / yacc / occam.lha / occam / occam2.y < prev    next >
Text File  |  1989-08-22  |  7KB  |  434 lines

  1. /* 
  2.  *
  3.  *        OCCAM2 yacc specification
  4.  *
  5.  *        Peter Polkinghorne - GEC Research
  6.  *
  7.  */
  8.  
  9. /*
  10.  * This work is in the public domain.
  11.  * It was written by Peter Polkinghorne in 1986 & 1989 at
  12.  * GEC Hirst Research Centre, Wembley, England.
  13.  * No liability is accepted or warranty given by the Author,
  14.  * still less my employers.
  15.  */
  16.  
  17. /* revision history
  18.     0.0    initial attempt                pjmp    9/3/89
  19.  
  20. end revisions */
  21.  
  22. %token        VAR    CHAN    ANY    SKIP    ID    EOL
  23. %token        VALUE    BYTE    DEF    PROC    NOT    NUMBER    BOOL
  24. %token        NOW    TABLE    BOOLOP    SHIFTOP    COMPOP    CHCON    STR
  25. %token        LOGOP    SEQ    ALT    IF    PAR    WHILE    FOR
  26. %token        OF    SIZE    TRUNC    ROUND    MOSTNEG    MOSTPOS    RNUMBER
  27. %token        STOP    CASE    ELSE    IS    VAL    FROM    PROTOCOL
  28. %token        INT    INT16    INT32    INT64    REAL    REAL32    REAL64
  29. %token        PLACE    AT    PLACED    PROCESSOR    FUNCTION
  30. %token        AFTER    RETYPES    VALOF    RESULT    PORT    PRI
  31. %token        BEG    END    TO    TIMER
  32.  
  33. %start        program
  34.  
  35. %%
  36.  
  37. program        :    sep process
  38.         |    process
  39.         ;
  40.  
  41. process        :    action sep
  42.         |    SKIP sep
  43.         |    STOP sep
  44.         |    CASE selector sep
  45.         |    CASE selector sep BEG selectlist END
  46.         |    construct
  47.         |    instance
  48.         |    specification sep process
  49.         |    caseinput
  50.         |    allocation sep process
  51.         |    error sep
  52.             {
  53.                 yyerrok;
  54.             }
  55.         ;
  56.  
  57. action        :    assignment
  58.         |    input
  59.         |    output
  60.         ;
  61.  
  62. allocation    :    PLACE ID AT expr ':'
  63.         ;
  64.  
  65. selectlist    :    select
  66.         |    selectlist select
  67.         ;
  68.  
  69. select        :    expr sep BEG process END
  70.         |    ELSE sep BEG process END
  71.         ;
  72.  
  73. selector    :    expr
  74.         ;
  75.  
  76. construct    :    sequence
  77.         |    parallel
  78.         |    conditional
  79.         |    alternation
  80.         |    loop
  81.         ;
  82.  
  83. instance    :    ID '(' actualist ')' sep
  84.         |    ID '(' ')' sep
  85.         ;
  86.  
  87. actualist    :    actual
  88.         |    actualist comma actual
  89.         ;
  90.  
  91. actual        :    element
  92.         |    expr
  93.         ;
  94.  
  95. sequence    :    SEQ sep BEG proclist END
  96.         |    SEQ replic sep BEG process END
  97.         |    SEQ sep
  98.         ;
  99.  
  100. parallel    :    PAR sep BEG proclist END
  101.         |    PAR replic sep BEG process END
  102.         |    PAR sep
  103.         |    PRI PAR sep BEG proclist END
  104.         |    PRI PAR replic sep BEG process END
  105.         |    PRI PAR sep
  106.         |    PLACED PAR sep BEG placelist END
  107.         |    PLACED PAR replic sep BEG placement END
  108.         |    PLACED PAR sep
  109.         ;
  110.  
  111. conditional    :    IF sep BEG choicelist END
  112.         |    IF replic sep BEG choice END
  113.         |    IF sep
  114.         ;
  115.  
  116. alternation    :    ALT sep BEG alternativelist END
  117.         |    ALT replic sep BEG alternative END
  118.         |    ALT sep
  119.         |    PRI ALT sep BEG alternativelist END
  120.         |    PRI ALT replic sep BEG alternative END
  121.         |    PRI ALT sep
  122.         ;
  123.  
  124. loop        :    WHILE expr sep BEG process END
  125.         ;
  126.  
  127. sep        :    EOL
  128.         |    sep EOL
  129.         ;
  130.  
  131. comma        :    ',' EOL
  132.         |    ','
  133.         ;
  134.  
  135. semicolon    :    ';' EOL
  136.         |    ';'
  137.         ;
  138.  
  139. proclist    :    process
  140.         |    proclist process
  141.         ;
  142.  
  143. choicelist    :    choice
  144.         |    choicelist choice
  145.         ;
  146.  
  147. placelist    :    placement
  148.         |    placelist placement
  149.         ;
  150.  
  151. alternativelist    :    alternative
  152.         |    alternativelist alternative
  153.         ;
  154.  
  155.  
  156. replic        :    ID '=' base FOR count
  157.         ;
  158.  
  159. base        :    expr
  160.         ;
  161.  
  162. count        :    expr
  163.         ;
  164.  
  165. choice        :    boolean sep BEG process END
  166.         |    specification sep choice
  167.         |    conditional
  168.         ;
  169.  
  170. placement    :    PROCESSOR expr sep BEG process END
  171.         ;
  172.  
  173. alternative    :    guard sep BEG process END
  174.         |    specification sep alternative
  175.         |    alternation
  176.         ;
  177.  
  178. guard        :    boolean '&' input
  179.         |    input
  180.         |    boolean '&' SKIP
  181.         ;
  182.  
  183. specification    :    declaration
  184.         |    abbreviation
  185.         |    definition
  186.         ;
  187.  
  188. declaration    :    type namelist ':'
  189.         ;
  190.  
  191. namelist    :    ID
  192.         |    namelist comma ID
  193.         ;
  194.  
  195. abbreviation    :    specifier ID IS element ':'
  196.         |    VAL specifier ID IS element ':'
  197.         |    ID IS element ':'
  198.         |    VAL ID IS element ':'
  199.         ;
  200.  
  201. specifier    :    primtype
  202.         |    '['']' specifier
  203.         |    '[' expr ']' specifier
  204.         ;
  205.  
  206. definition    :    PROTOCOL ID IS simpleproto ':'
  207.         |    PROTOCOL ID IS seqproto ':'
  208.         |    PROTOCOL ID sep BEG CASE sep END ':'
  209.         |    PROTOCOL ID sep BEG CASE sep BEG tagprotolist END END ':'
  210.         |    PROC ID '(' fparmlist ')' sep BEG process END ':'
  211.         |    PROC ID '(' ')' sep BEG process END ':'
  212.         |    typelist FUNCTION ID '(' fparmlist ')' sep BEG valof END ':'
  213.         |    typelist FUNCTION ID '(' ')' sep BEG valof END ':'
  214.         |    typelist FUNCTION ID '(' fparmlist ')' IS explist ':'
  215.         |    typelist FUNCTION ID '(' ')' IS explist ':'
  216.         |    specifier ID RETYPES element ':'
  217.         |    VAL specifier ID RETYPES expr ':'
  218.         ;
  219.  
  220. simpleproto    :    type
  221.         |    type ':' ':' '[' ']' type
  222.         ;
  223.  
  224. seqproto    :    simpleproto
  225.         |    seqproto semicolon simpleproto
  226.         ;
  227.  
  228. tagprotolist    :    tagproto
  229.         |    tagprotolist sep tagproto
  230.         ;
  231.  
  232. tagproto    :    tag
  233.         |    tag semicolon protocol
  234.         ;
  235.  
  236. tag        :    ID
  237.         ;
  238.  
  239. protocol    :    ANY
  240.         |    ID
  241.         |    simpleproto
  242.         ;
  243.  
  244. assignment    :    varlist ':' '=' explist
  245.         ;
  246.  
  247. input        :    chan '?' inlist
  248.         |    chan '?' CASE taggedlist
  249.         |    port '?' var
  250.         |    timer '?' var
  251.         |    timer '?' AFTER expr
  252.         ;
  253.  
  254. caseinput    :    chan '?' CASE sep
  255.         |    chan '?' CASE sep BEG variantlist END
  256.         ;
  257.  
  258. taggedlist    :    tag
  259.         |    tag semicolon inlist
  260.         ;
  261.  
  262. variantlist    :    variant
  263.         |    variantlist sep variant
  264.         ;
  265.  
  266. variant        :    taggedlist sep BEG process END
  267.         |    specification sep variant
  268.         ;
  269.  
  270. output        :    chan '!' outlist
  271.         |    chan '!' tag
  272.         |    chan '!' tag semicolon outlist
  273.         |    port '!' element
  274.         |    port '!' expr
  275.         ;
  276.  
  277. inlist        :    var
  278.         |    var ':' ':' var
  279.         |    inlist semicolon var
  280.         ;
  281.  
  282. outlist        :    expr
  283.         |    expr ':' ':' expr
  284.         |    outlist semicolon expr
  285.         ;
  286.  
  287. explist        :    expr
  288.         |    explist comma expr
  289.         |    '(' valof sep ')'
  290.         |    ID '(' explist ')'
  291.         |    ID '(' ')'
  292.         ;
  293.  
  294. varlist        :    var
  295.         |    varlist comma var
  296.         ;
  297.  
  298. typelist    :    type
  299.         |    typelist comma type
  300.         ;
  301.  
  302. fparmlist    :    fparm
  303.         |    fparmlist comma fparm
  304.         ;
  305.  
  306. fparm        :    specifier ID
  307.         |    VAL specifier ID
  308.         ;
  309.  
  310. var        :    element
  311.         ;
  312.  
  313. timer        :    element
  314.         ;
  315.  
  316. chan        :    element
  317.         ;
  318.  
  319. port        :    element
  320.         ;
  321.  
  322. element        :    ID
  323.         |    element '[' subscript ']'
  324.         |    '[' element FROM subscript TO subscript ']'
  325.         ;
  326.  
  327. subscript    :    expr
  328.         ;
  329.  
  330. expr        :    monop operand
  331.         |    operand dyop operand
  332.         |    monop sep operand
  333.         |    operand dyop sep operand
  334.         |    operand
  335.         |    conversion
  336.         |    MOSTPOS type
  337.         |    MOSTNEG type
  338.         ;
  339.  
  340. operand        :    element
  341.         |    literal
  342.         |    '(' expr ')'
  343.         |    '[' explist ']'
  344.         |    '(' valof sep ')'
  345.         |    ID '(' explist ')'
  346.         |    ID '(' ')'
  347.         ;
  348.  
  349. conversion    :    type operand
  350.         |    type ROUND operand
  351.         |    type TRUNC operand
  352.         ;
  353.  
  354. monop        :    '-'
  355.         |    NOT
  356.         |    SIZE
  357.         |    '~'
  358.         ;
  359.  
  360. literal        :    NUMBER
  361.         |    BOOL
  362.         |    RNUMBER
  363.         |    CHCON
  364.         |    STR
  365.         |    NUMBER '(' type ')'
  366.         |    RNUMBER '(' type ')'
  367.         |    CHCON '(' type ')'
  368.         ;
  369.  
  370. dyop        :    COMPOP
  371.         |    '='
  372.         |    SHIFTOP
  373.         |    '+'
  374.         |    '*'
  375.         |    LOGOP
  376.         |    BOOLOP
  377.         |    '-'
  378.         |    '/'
  379.         |    '\\'
  380.         ;
  381.  
  382. valof        :    VALOF sep BEG process RESULT explist sep END
  383.         |    specification sep valof
  384.         ;
  385.  
  386. type        :    primtype
  387.         |    arrtype
  388.         ;
  389.  
  390. primtype    :    CHAN OF protocol
  391.         |    PORT OF type
  392.         |    TIMER
  393.         |    BOOL
  394.         |    BYTE
  395.         |    INT
  396.         |    INT16
  397.         |    INT32
  398.         |    INT64
  399.         |    REAL32
  400.         |    REAL64
  401.         ;
  402.  
  403. arrtype        :    '[' expr ']' type
  404.         ;
  405.  
  406. boolean        :    expr
  407.         ;
  408.  
  409. %%
  410.  
  411. #include <stdio.h>
  412.  
  413. void main()
  414. {
  415.  
  416.     exit( yyparse() );
  417.  
  418. }/*main*/
  419.  
  420. yyerror( str )
  421. char     *str;
  422. /* our slightly more informative error routine */
  423. {
  424.  
  425. extern int    yylineno;
  426. extern char    yytext[];
  427.  
  428.     fprintf( stderr, "ERROR <%s> near <%s> on line %d\n",
  429.             str, yytext, yylineno );
  430.  
  431. }/*yyerror*/
  432.  
  433. /*end occam.y*/
  434.